/**
 * 定义：调用一个对象的一个方法，以另一个对象替换当前对象。
 * 说明： call 方法可以用来代替另一个对象调用一个方法。
 * call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。
 * thisObj的取值有以下4种情况：
 * （1） 不传，或者传null,undefined， 函数中的this指向window对象
 * （2） 传递另一个函数的函数名，函数中的this指向这个函数的引用
 * （3） 传递字符串、数值或布尔类型等基础类型，函数中的this指向其对应的包装对象，如 String、Number、Boolean
 * （4） 传递一个对象，函数中的this指向这个对象
 */

// function a(){   
//   console.log(this);     //输出函数a中的this对象
// }       

// function b(){}       

// var c = { name:"call" }; //定义对象c  

// a.call();                //window
// a.call(null);            //window
// a.call(undefined);       //window
// a.call(1);               //Number
// a.call('');              //String
// a.call(true);            //Boolean
// a.call(b);               //function b(){}
// a.call(c);               //Object

// function class1() {   
//   this.name = function() {   
//     console.log("我是class1内的方法");   
//   }   
// }   
// function class2() { 
//   class1.call(this);     //此行代码执行后，当前的this指向了class1（也可以说class2继承了class1）   
// }   

// var f = new class2();   
// f.name();               //调用的是class1内的方法，将class1的name方法交给class2使用

// function eat(x,y){   
//   console.log(x+y);   
// }   
// function drink(x,y){   
//   console.log(x-y);   
// }   
// drink.call(eat,3,2);

// function Animal() {   
//   this.name = "animal";   
//   this.showName = function() {   
//     console.log(this.name);   
//   }   
// }   
// function Dog() {   
//   this.name = "dog";   
// }   
// var animal = new Animal();   
// var dog = new Dog();       

// animal.showName.call(dog);  // dog


function Animal(name) {   
  this.name = name;   
  this.showName = function(){   
    console.log(this.name);   
  }   
}   
function Dog(name) {   
  Animal.call(this,name);   
}   
var dog = new Dog("Crazy dog");   
dog.showName(); // Crazy dog